package tests;
import excepciones.ProbabilidadIncorrectaException;
import modelo.*;
import junit.framework.TestCase;
import utilitarios.DireccionArriba;
import utilitarios.DireccionDerecha;
import utilitarios.PuntoXY;

public class PruebasBonus extends TestCase {
	
	public void testSiTanqueCaminaSobreBonusDeVidaSuResistenciaAumenta() {
		
		// ARRANGE
		Escenario escenario = new Escenario(300, 300);
		TanqueAlgo tanque = new TanqueAlgo(escenario, new PuntoXY(30, 30));
		BonusDeVida bonus = null;
        try {
            bonus = new BonusDeVida(escenario, new PuntoXY(30, 70));
        } catch (ProbabilidadIncorrectaException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
		
		escenario.agregarObjeto(tanque);
		escenario.agregarObjeto(bonus);
		
		double resistenciaInicial = tanque.getResistencia();
		
		// ACT
		for (int i = 0; i < 10; i++) {	
			tanque.seMovera(new DireccionArriba());
			escenario.vivir();
		}
		
		// ASSERT
		assertEquals(resistenciaInicial * 1.4, tanque.getResistencia());
		assertEquals(false, escenario.contieneA(bonus));
	}
	
	public void testSiTanqueCaminaSobreBonusDeAtaqueSuVelocidadPropiaYLaDelDisparoAumenta() {
		
		// ARRANGE
		Escenario escenario = new Escenario(300, 300);
		TanqueAlgo tanque = new TanqueAlgo(escenario, new PuntoXY(15, 15));
		BonusDeAtaque bonus = null;
        try {
            bonus = new BonusDeAtaque(escenario, new PuntoXY(15, 48));
        } catch (ProbabilidadIncorrectaException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
		
		escenario.agregarObjeto(tanque);
		escenario.agregarObjeto(bonus);
		
		double velocidadTanqueInicial = tanque.getVelocidadMovimiento();
		double velocidadDisparo = tanque.getVelocidadDisparo();
		
		// ACT
		for (int i = 0; i < 4; i++) {
			tanque.seMovera(new DireccionArriba());
			escenario.vivir();
		}
		
		// ASSERT
		assertEquals(velocidadTanqueInicial * 1.2, tanque.getVelocidadMovimiento());
		assertEquals(velocidadDisparo * 1.3, tanque.getVelocidadDisparo());
		assertEquals(false, escenario.contieneA(bonus));
	}
	
	public void testSiProyectilTocaBonusNoPasaNadaYsigueDeLargo() {
		
		// ARRANGE
		Escenario escenario = new Escenario(300, 300);
		Proyectil bala = new Proyectil(escenario, new PuntoXY(15, 15));
		Bonus bonus = null;
        try {
            bonus = new BonusDeVida(escenario, new PuntoXY(47, 15));
        } catch (ProbabilidadIncorrectaException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
		
		escenario.agregarObjeto(bala);
		escenario.agregarObjeto(bonus);
		
		// ACT
		bala.seMovera(new DireccionDerecha());
		for (int i = 1; i < 5; i++) {
			escenario.vivir();
		}
		
		// ASSERT
		assertEquals(true, escenario.contieneA(bonus));
		assertEquals(true, escenario.contieneA(bala));		
	}
	
	public void testSiProyectilTocaArmaNoPasaNadaYsigueDeLargo() {
		
		// ARRANGE
		Escenario escenario = new Escenario(300, 300);
		Proyectil bala = new Proyectil(escenario, new PuntoXY(15, 15));
		Arma arma = new LanzaCohetes(escenario, new PuntoXY(47, 15));
		
		escenario.agregarObjeto(bala);
		escenario.agregarObjeto(arma);
		
		// ACT
		bala.seMovera(new DireccionDerecha());
		for (int i = 1; i < 5; i++) {
			escenario.vivir();
		}
		
		// ASSERT
		assertEquals(true, escenario.contieneA(arma));
		assertEquals(true, escenario.contieneA(bala));		
	}
	
	public void testSiTanqueEnemigoCaminaSobreBonusNoPasaNada() {
		
		// ARRANGE
		Escenario escenario = new Escenario(1000, 1000);
		TanqueAlgo algotank = new TanqueAlgo(escenario, new PuntoXY(300.0, 30.0));
		TanqueEnemigo enemigo = new TanqueGrizzly(escenario, new PuntoXY(30.0, 30.0), algotank);
		Bonus bonus = null;
        try {
            bonus = new BonusDeVida(escenario, new PuntoXY(60.0, 30.0));
        } catch (ProbabilidadIncorrectaException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
		
		escenario.agregarObjeto(enemigo);
		escenario.agregarObjeto(bonus);
		
		double resistenciaInicialTanque = enemigo.getResistencia();
		PuntoXY posicionInicialBonus = bonus.getFigura().getCentroMasa();
		
		// ACT
		enemigo.seMovera(new DireccionDerecha());
		for (int i = 1; i < 5; i++) {
			escenario.vivir();
		}
		
		// ASSERT
		assertEquals(true, escenario.contieneA(bonus));
		assertEquals(resistenciaInicialTanque, enemigo.getResistencia());
		assertEquals(posicionInicialBonus, bonus.getFigura().getCentroMasa());
		
	}

}
